package tc.jv.task4;

import tc.jv.task9.IncompatibleVectorSizeException;

/**
 * 
 * @author Vadim Gidulyan
 *
 */
public interface Vector
{
	
	// ACCESSORS
	
	/**
	 * Возвращает количество элементов в этом векторе
	 * 
	 * @return количество элементов в этом векторе
	 */
	int size();
	
	/**
	 * Возвращает элемент в указанной позиции вектора
	 * 
	 * @param index индекс возвращаемого элемента
	 * @return элемент в указанной позиции вектора
	 */
	double get(int index);
	
	/**
	 * Заменяет элемент в указанной позиции в векторе указанным элеметом
	 * 
	 * @param index индекс заменяемого элемента
	 * @param value элемент, который будет записан в указанную позицию
	 * @return элемент, который был в указанной позиции
	 */
	double set(int index, double value);
	
	// SUPERCLASS METHODS
	
	Object clone();

	boolean equals(Object obj);

	int hashCode();

	/**
	 * Возвращает строковое представление объекта
	 * <p>
	 * Возвращает список элементов вектора
     *
     * @return строковое представление объекта
     */
	String toString();
	
	// METHODS
	
	/**
	 * Возвращает строковое представление объекта
	 * <p>
	 * Возвращает список элементов вектора с указанной точностью
     *
     * @param pcs количество знаков после запятой
     * @return строковое представление объекта
     */
	String toString(int pcs);
	
	/**
	 * Выводит на экран строковое представление объекта
	 */
	void print();
	
	/**
	 * Выводит на экран строковое представление объекта с указанной точностью
	 * 
	 * @param pcs количество знаков после запятой
	 */
	void print(int pcs);
	
	/**
	 * Вставляет указанный элемент в начало вектора
	 * 
	 * @param value элемент для добавления
	 */
	void addFirst(double value);
	
	/**
	 * Вставляет указанный элемент в конец вектора
	 * 
	 * @param value элемент для добавления
	 */
	void addLast(double value);
	
	/**
	 * Добавляет указанный элемент в конец вектора
	 * 
	 * @param value элемент, который будет добавлен в конец
	 */
	void add(double value);
	
	/**
	 * Вставляет указанный элемент в указанную позицию
	 * <p>
	 * Сдвигает текущий элемент в этой позиции и следующие за ним элементы
	 * вправо
	 * 
	 * @param index позиция, в которую будет вставлен указанный элемент 
	 * @param value элемент, который будет вставлен
	 * @return {@code true} если элемент вставлен успешно
	 */
	boolean add(int index, double value);
	
	/**
	 * Удаляет элемент вектора с указанной позицией
	 * <p>
	 * Сдвигает последующие элементы влево
	 *  
	 * @param index позиция удаляемого элемента
	 * @return элемент, который был в указанной позиции
	 */
	double remove(int index);
	
	/**
	 * Заполняет вектор из указанного массива
	 * <p>
	 * Заполнение начинается с начала вектора
	 * 
	 * @param array массив, элементы которого будут записаны в вектор
	 * @return {@code true} если вектор заполнен успешно
	 * @throws IncompatibleVectorSizeException
	 */
	boolean fill(double[] array) throws IncompatibleVectorSizeException;

	/**
	 * Заполняет вектор из указанного массива начиная с указанной позиции
	 * 
	 * @param array массив, элементы которого будут записаны в вектор
	 * @param position позиция, начиная с которой в вектор будут
	 * 				   записываться элементы
	 * @return {@code true} если вектор заполнен успешно
	 * @throws IncompatibleVectorSizeException
	 */
	boolean fill(double[] array, int position) throws IncompatibleVectorSizeException;
	
	/**
	 * Заполняет вектор из указанного вектора
	 * <p>
	 * Заполнение начинается с начала этого вектора
	 * 
	 * @param v вектор, элементы которого будут записаны в этот вектор
	 * @return {@code true} если вектор заполнен успешно
	 * @throws IncompatibleVectorSizeException
	 */
	boolean fill(Vector v) throws IncompatibleVectorSizeException;
	
	/**
	 * Заполняет вектор из указанного вектора начиная с указанной позиции
	 * 
	 * @param v вектор, элементы которого будут записаны в этот вектор
	 * @param position позиция, начиная с которой в этот вектор будут 
	 * 				   записываться элементы
	 * @return {@code true} если вектор заполнен успешно
	 * @throws IncompatibleVectorSizeException
	 */
	boolean fill(Vector v, int position) throws IncompatibleVectorSizeException;

	/**
	 * Суммирует элементы этого вектора с элементами из указанного вектора
	 * <p>
	 * Суммирование начинается с начала этого вектора
	 * 
	 * @param v вектор, с элементами которого будет происходить суммирование
	 * @return {@code true} если суммирование выполнено успешно
	 * @throws IncompatibleVectorSizeException
	 */
	boolean sum(Vector v) throws IncompatibleVectorSizeException;
	
	/**
	 * Суммирует элементы этого вектора с элементами из указанного вектора
	 * начиная с указанной позиции
	 * 
	 * @param v вектор, с элементами которого будет происходить суммирование
	 * @param position позиция в этом векторе, начиная с которой будут 
	 * 				   суммироваться элементы
	 * @return {@code true} если суммирование выполнено успешно
	 * @throws IncompatibleVectorSizeException
	 */
	boolean sum(Vector v, int position) throws IncompatibleVectorSizeException;
	
	/**
	 * Умножает элементы этого вектора на указанное число
	 * 
	 * @param multiplicator число, на которое будут умножаться элементы вектора 
	 * @return {@code true} если суммирование выполнено успешно
	 */
	boolean multiply(double multiplicator);
	
}
